]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
st-im-text: Replace key-* handler with captured-event
authorFlorian Müllner <fmuellner@gnome.org>
Wed, 12 Sep 2012 12:35:52 +0000 (14:35 +0200)
committerFlorian Müllner <fmuellner@gnome.org>
Wed, 12 Sep 2012 16:50:26 +0000 (18:50 +0200)
When using an input method like IBus, the IM is expected to process
key events before anything else. Currently this doesn't always work
as expected, as the event filtering is done in the default handlers
of the key-press and key-release events, e.g. only after other
handlers have been run.
To allow the IM to filter events earlier, move the code to a
captured-event handler instead.

https://bugzilla.gnome.org/show_bug.cgi?id=658325

src/st/st-im-text.c

index 0e13f4277f7e9e5a5a40448a729c0f77ff8d4f40..874b841e680999a32b5a1c62a4942beb4e35cec3 100644 (file)
@@ -355,18 +355,22 @@ st_im_text_button_press_event (ClutterActor       *actor,
 }
 
 static gboolean
-st_im_text_key_press_event (ClutterActor    *actor,
-                            ClutterKeyEvent *event)
+st_im_text_captured_event (ClutterActor *actor,
+                           ClutterEvent *event)
 {
   StIMText *self = ST_IM_TEXT (actor);
   StIMTextPrivate *priv = self->priv;
   ClutterText *clutter_text = CLUTTER_TEXT (actor);
+  ClutterEventType type = clutter_event_type (event);
   gboolean result = FALSE;
   int old_position;
 
+  if (type != CLUTTER_KEY_PRESS && type != CLUTTER_KEY_RELEASE)
+    return FALSE;
+
   if (clutter_text_get_editable (clutter_text))
     {
-      GdkEventKey *event_gdk = key_event_to_gdk (event);
+      GdkEventKey *event_gdk = key_event_to_gdk ((ClutterKeyEvent *)event);
 
       if (gtk_im_context_filter_keypress (priv->im_context, event_gdk))
         {
@@ -380,45 +384,16 @@ st_im_text_key_press_event (ClutterActor    *actor,
   old_position = clutter_text_get_cursor_position (clutter_text);
 
   if (!result &&
-      CLUTTER_ACTOR_CLASS (st_im_text_parent_class)->key_press_event)
-    result = CLUTTER_ACTOR_CLASS (st_im_text_parent_class)->key_press_event (actor, event);
+      CLUTTER_ACTOR_CLASS (st_im_text_parent_class)->captured_event)
+    result = CLUTTER_ACTOR_CLASS (st_im_text_parent_class)->captured_event (actor, event);
 
-  if (clutter_text_get_cursor_position (clutter_text) != old_position)
+  if (type == CLUTTER_KEY_PRESS &&
+      clutter_text_get_cursor_position (clutter_text) != old_position)
     reset_im_context (self);
 
   return result;
 }
 
-static gboolean
-st_im_text_key_release_event (ClutterActor    *actor,
-                              ClutterKeyEvent *event)
-{
-  StIMText *self = ST_IM_TEXT (actor);
-  StIMTextPrivate *priv = self->priv;
-  ClutterText *clutter_text = CLUTTER_TEXT (actor);
-  GdkEventKey *event_gdk;
-  gboolean result = FALSE;
-
-  if (clutter_text_get_editable (clutter_text))
-    {
-      event_gdk = key_event_to_gdk (event);
-
-      if (gtk_im_context_filter_keypress (priv->im_context, event_gdk))
-        {
-          priv->need_im_reset = TRUE;
-          result = TRUE;
-        }
-
-      gdk_event_free ((GdkEvent *)event_gdk);
-    }
-
-  if (!result &&
-      CLUTTER_ACTOR_CLASS (st_im_text_parent_class)->key_release_event)
-    result = CLUTTER_ACTOR_CLASS (st_im_text_parent_class)->key_release_event (actor, event);
-
-  return result;
-}
-
 static void
 st_im_text_key_focus_in (ClutterActor *actor)
 {
@@ -467,8 +442,7 @@ st_im_text_class_init (StIMTextClass *klass)
   actor_class->unrealize = st_im_text_unrealize;
 
   actor_class->button_press_event = st_im_text_button_press_event;
-  actor_class->key_press_event = st_im_text_key_press_event;
-  actor_class->key_release_event = st_im_text_key_release_event;
+  actor_class->captured_event = st_im_text_captured_event;
   actor_class->key_focus_in = st_im_text_key_focus_in;
   actor_class->key_focus_out = st_im_text_key_focus_out;
 }